package order.management.main;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Iterator;
import order.management.IO.AdminFrame;
import order.management.IO.CustomerFrame;
import order.management.IO.LogInFrame;
import order.management.models.OPDept;
import order.management.models.Order;
import order.management.models.Product;
import order.management.models.Warehouse;
public class Controller implements ActionListener {
private static final int LOG_IN = 0;
private static final int ADMIN = 1;
private static final int GUEST = 2;
private int CURRENT_FRAME = LOG_IN;
private OPDept orderDept;
private Warehouse warehouse;
private LogInFrame logInFrame;
private AdminFrame adminFrame;
private CustomerFrame customerFrame;
public Controller(LogInFrame logInFrame) {
this.logInFrame = logInFrame;
this.logInFrame.logInOutButton.addActionListener(this);
adminFrame = null;
customerFrame = null;
warehouse = null;
orderDept = null;
deserialization(); // warehouse & orderDept
}
@Override
public void actionPerformed(ActionEvent event) {
Object source = event.getSource();
if (source == logInFrame.logInOutButton) {
if (logInFrame.selectedUser.equals(LogInFrame.ADMIN)) { // instantiate
// adminFrame
CURRENT_FRAME = ADMIN;
logInFrame.frame.setVisible(false);
adminFrame = new AdminFrame(warehouse);
adminFrame.logInOutButton.addActionListener(this);
adminFrame.searchFilterButton.addActionListener(this);
adminFrame.seePendingOrders.addActionListener(this);
adminFrame.addProductButton.addActionListener(this);
adminFrame.tableProducts.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent evt) {
int auxRow = adminFrame.tableProducts.rowAtPoint(evt.getPoint());
int auxCol = adminFrame.tableProducts.columnAtPoint(evt.getPoint());
if (auxRow >= 0 && auxCol >= 0) {
if (auxCol == 4) { // MODIFY
Iterator<Product> iterator = warehouse.products.iterator();
while (iterator.hasNext()) {
Product auxP = iterator.next();
if (auxP.name.equals(adminFrame.tableProducts.getValueAt(auxRow, 0))) {
adminFrame.queryModifyProduct(auxP);
adminFrame.updateTable(warehouse);
serializationWarehouse();
break; // found product
}
}
} else if (auxCol == 5) { // REMOVE
Iterator<Product> iterator = warehouse.products.iterator();
while (iterator.hasNext()) {
Product auxP = iterator.next();
if (auxP.name.equals(adminFrame.tableProducts.getValueAt(auxRow, 0))) {
adminFrame.removeRowFromTable(auxRow);
warehouse.products.remove(auxP);
adminFrame.updateTable(warehouse);
serializationWarehouse();
break; // found product
}
}
}
}
}
});
} else if (logInFrame.selectedUser.equals(LogInFrame.GUEST)) { // instantiate
// customerFrame
CURRENT_FRAME = GUEST;
logInFrame.frame.setVisible(false);
customerFrame = new CustomerFrame(warehouse);
customerFrame.logInOutButton.addActionListener(this);
customerFrame.searchFilterButton.addActionListener(this);
customerFrame.tableProducts.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent evt) {
int auxRow = customerFrame.tableProducts.rowAtPoint(evt.getPoint());
int auxCol = customerFrame.tableProducts.columnAtPoint(evt.getPoint());
if (auxRow >= 0 && auxCol >= 0) {
if (auxCol == 4) { // ORDER
Iterator<Product> iterator = warehouse.products.iterator();
while (iterator.hasNext()) {
Product auxP = iterator.next();
if (auxP.name.equals(customerFrame.tableProducts.getValueAt(auxRow, 0))) {
// *** 1 ***//
int nrPieces = customerFrame.queryPiecesForOrder();
if (nrPieces <= 0
|| nrPieces > (int) customerFrame.tableProducts.getValueAt(auxRow, 2)) {
// >stock
// *** 2 ***//
customerFrame.errorMessageOrder();
} else {
// if the required number of pieces
// is
// available
// *** 3 ***//
Order auxOO = customerFrame.queryPlaceOrderAsCustomer(auxP, nrPieces);
orderDept.orders.add(auxOO);
serializationOrderDept();//-----------------------------
// save the last order
auxP.stock -= nrPieces;
customerFrame.updateTable(warehouse);
serializationWarehouse();//--------------------------????
// save the new stock
}
break; // found product
}
}
}
}
}
});
}
} else if (CURRENT_FRAME == ADMIN && adminFrame != null) {
if (source == adminFrame.logInOutButton) {
CURRENT_FRAME = LOG_IN;
adminFrame.frame.setVisible(false);
logInFrame.frame.setVisible(true);
} else if (source == adminFrame.addProductButton) {
Product auxPP = adminFrame.getNewProduct();
if (auxPP != null) { // catch nullPointerEx
warehouse.addExistentProduct(auxPP);
serializationWarehouse();
}
adminFrame.updateTable(warehouse);
} else if (source == adminFrame.seePendingOrders) {
adminFrame.seePendingOrders(orderDept);
} else if (source == adminFrame.searchFilterButton) {
adminFrame.updateTable(warehouse, adminFrame.jTextField.getText());
}
} else if (CURRENT_FRAME == GUEST && customerFrame != null) {
if (source == customerFrame.logInOutButton) {
CURRENT_FRAME = LOG_IN;
customerFrame.frame.setVisible(false);
logInFrame.frame.setVisible(true);
} else if (source == customerFrame.searchFilterButton) {
customerFrame.updateTable(warehouse, customerFrame.jTextField.getText());
}
} // event source = customer frame
}
//@SuppressWarnings("unused")
private void deserialization() {
try {
FileInputStream fileIn1 = new FileInputStream("wh.ser");
FileInputStream fileIn2 = new FileInputStream("od.ser");
ObjectInputStream in1 = new ObjectInputStream(fileIn1);
ObjectInputStream in2 = new ObjectInputStream(fileIn2);
warehouse = (Warehouse) in1.readObject();
orderDept = (OPDept) in2.readObject();
in1.close();
fileIn1.close();
in2.close();
fileIn2.close();
} catch (IOException i) { // FileNotFoundException
i.printStackTrace();
return;
} catch (ClassNotFoundException c) {
System.out.println("class not found");
c.printStackTrace();
return;
}
}
private void serializationWarehouse() {
try {
FileOutputStream fileOut1 = new FileOutputStream("wh.ser");// new
// File("wh.ser"));
ObjectOutputStream out1 = new ObjectOutputStream(fileOut1);
out1.writeObject(warehouse);
out1.flush();
out1.close();
fileOut1.close();
System.out.printf("Serialized data is saved in /wh.ser");
} catch (IOException i) {
i.printStackTrace();
}
}
private void serializationOrderDept() {
try {
FileOutputStream fileOut1 = new FileOutputStream("od.ser");// new
// File("od.ser"));
ObjectOutputStream out1 = new ObjectOutputStream(fileOut1);
out1.writeObject(orderDept);
out1.flush();
out1.close();
fileOut1.close();
System.out.printf("Serialized data is saved in /od.ser");
} catch (IOException i) {
i.printStackTrace();
}
}
}